#include <stdio.h>
#include <stdlib.h>  // malloc申请的空间必须手动销毁（定义的变量数组等系统会帮你销毁） 、它和free成对出现


/*
链栈
    只能在头节点处插入删除的单链表
*/

typedef struct LNode
{
    int data;
    struct LNode *next;
} *LiStack;  // 栈类型定义

// 不带头结点
bool InitStack(LiStack &LS)
{
    LS = NULL;
    return true;
}

bool Push(LiStack &LS, int x)
{
    // 创建节点 n
    LNode *n = (LNode *)malloc(sizeof(LNode));
    n->data = x;
    // 第一个元素入栈
    if ( LS==NULL )
    {
        LS = n;
        n->next = NULL;

        return true;
    }

    n->next = LS;
    LS = n;

    return true;
}

int  Pop(LiStack &LS)
{
    if ( LS==NULL )  // 栈空
    {
        return -1;
    }

    int x;
    x = LS->data;
    LS = LS->next;

    return x;

}
int GetTop(LiStack LS)
{
    int x;
    x = LS->data;
    return x;
}

void show(LiStack LS)
{
    LNode *p = LS;
    while( p!=NULL )
    {
        printf("| %i |\n", p->data);
        puts("-----\n");

        p = p->next;
        
    }
}

int main()
{
    LiStack LS;
    InitStack(LS);

 
    Push(LS, 1);
    Push(LS, 2);
    Push(LS, 3);
    show(LS);

    int k = Pop(LS);
    printf("%i \n\n", k);
    show(LS);

    Pop(LS);
    Pop(LS);
    Pop(LS);
    puts("pop end...");
    show(LS);

    return 0;
}